import Vue from 'vue'
import router from './router'
import store from './store'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import {
  ACCESS_TOKEN,
  INDEX_MAIN_PAGE_PATH
} from '@/store/mutation-types'
import {
  generateIndexRouter
} from '@/utils/util'
import {
  notification
} from 'ant-design-vue'
import { title } from './defaultSettings'
NProgress.configure({
  showSpinner: false
}) // NProgress Configuration

const whiteList = [
  '/user/login',
  '/register/register',
  '/register/toRegister',
  '/register/succeeRegister',
  '/register/numVerification',
  '/user/register-result',
  '/user/alteration'
]

function errCall (e, to, next) {
  console.warn(e)
  NProgress.done()
  notification.error({
    message: '系统提示',
    description: e.toString(),
    duration: 4
  })
  store.dispatch('Logout').then(() => {
    next({
      path: '/user/login',
      query: {
        ...to.fullPath
      }
    })
  })
}

router.beforeEach((to, from, next) => {
  // 修改标题
  if (to.fullPath.includes('register')) {
    document.title = title
  } else {
    document.title = title
  }
  NProgress.start() // start progress bar
  if (Vue.ls.get(ACCESS_TOKEN)) {
    /* has token */
    if (to.path === '/user/login') {
      next({
        path: INDEX_MAIN_PAGE_PATH
      })
      NProgress.done()
    } else {
      // 用户信息为空 或者菜单为空就重新获取用户信息
      if (
        window._UTILS.isEmptyObject(store.getters.userInfo)
      ) {
        store
          .dispatch('GetUserInfo')
          .then(() => {
            store.dispatch('GetDictData')
            store
              .dispatch('GetMenu')
              .then(res => {
                const menuData = res.data
                if (!window._UTILS.isArray(menuData) || !menuData.length) return
                let constRoutes = generateIndexRouter(menuData)
                // 添加主界面路由
                store.dispatch('UpdateAppRouter', {
                  constRoutes
                }).then(() => {
                  // 根据roles权限生成可访问的路由表
                  // 动态添加可访问路由表
                  router.addRoutes(store.getters.addRouters)
                  const redirect = decodeURIComponent(
                    from.query.redirect || to.path
                  )
                  if (to.path === redirect) {
                    // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
                    next({
                      ...to,
                      replace: true
                    })
                  } else {
                    // 跳转到目的路由
                    next({
                      path: redirect
                    })
                  }
                })
              })
              .catch(e => {
                errCall(e, to, next)
              })
          })
          .catch(e => {
            errCall(e, to, next)
          })
      } else {
        next()
      }
    }
  } else {
    if (whiteList.indexOf(to.path) !== -1) {
      // 在免登录白名单，直接进入
      next()
    } else {
      next({
        path: '/user/login',
        query: {
          ...to.query
        }
      })
      NProgress.done() // if current page is login will not trigger afterEach hook, so manually handle it
    }
  }
})

router.afterEach((e) => {
  NProgress.done() // finish progress bar
})
